# Python MySQL - mysql-connector 驱动
# MySQL 是最流行的关系型数据库管理系统，使用 mysql-connector 来连接使用 MySQL
# 可以使用 pip 命令来安装 mysql-connector：python -m pip install mysql-connector
# MySQL下执行以下命令修改密码：
# ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

import mysql.connector
# 连接MySQL数据库
mydb = mysql.connector.connect(
    host='localhost',  # 数据库主机地址
    user='root',
    passwd='123456',
    database='hdb'
)

mycursor = mydb.cursor()
# 若数据库不存在，创建数据库
# mycursor.execute("create database hdb")

# 输出所有数据库列表
mycursor.execute("SHOW DATABASES")
for x in mycursor:
    print(x)

# 创建数据表
mycursor.execute(
    'create table user(id int auto_increment primary key,name varchar(20),url varchar(255))')

# 输出所有数据库列表
# mycursor.execute("SHOW TABLES")
# for x in mycursor:
#     print(x)

# 主键设置  使用 "INT AUTO_INCREMENT PRIMARY KEY" 语句来创建一个主键，主键起始值为 1，逐步递增。
# mycursor.execute('alter table user add column id int auto_increment primary key')

# 插入数据
sql = 'insert into user (name ,url) values(%s,%s)'
val = ("Daniel", "www.daniel.com")
mycursor.execute(sql, val)
mydb.commit()   # 数据表内容有更新，必须使用到该语句
print(mycursor.rowcount, "记录插入成功。")

# 批量插入
# 批量插入使用 executemany() 方法，该方法的第二个参数是一个元组列表，包含了我们要插入的数据：
sql = "INSERT INTO user (name, url) VALUES (%s, %s)"
val = [
    ('Google', 'https://www.google.com'),
    ('Github', 'https://www.github.com'),
    ('Taobao', 'https://www.taobao.com'),
    ('stackoverflow', 'https://www.stackoverflow.com/')
]
mycursor.executemany(sql, val)
mydb.commit()    # 数据表内容有更新，必须使用到该语句
print(mycursor.rowcount, "记录插入成功。")

# 获取插入数据的Id
sql = "INSERT INTO user (name, url) VALUES (%s, %s)"
val = ("Zhihu", "https://www.zhihu.com")
mycursor.execute(sql, val)
mydb.commit()
print("1 条记录已插入, ID:", mycursor.lastrowid)

# 查询数据
# mycursor.execute("SELECT name, url FROM sites")
mycursor.execute('select * from user')
myresult = mycursor.fetchall()      # fetchall()获取所有记录
for x in myresult:
    print(x)

# 只想读取一条数据，可以使用 fetchone()
mycursor.execute("SELECT * FROM user")
myresult = mycursor.fetchone()
print(myresult)

# where 语句，读取指定条件的数据
sql = "select * from user where name = 'Daniel'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

# 使用通配符 %：
sql = "SELECT * FROM user WHERE url LIKE '%oo%'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

# 防止数据库查询发生 SQL 注入的攻击，我们可以使用 %s 占位符来转义查询的条件：
sql = "SELECT * FROM user WHERE name = %s"
na = ("Daniel", )
mycursor.execute(sql, na)
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

# 排序
# 查询结果排序可以使用 ORDER BY 语句，默认的排序方式为升序，关键字为 ASC，如果要设置降序排序，可以设置关键字 DESC。
sql = "SELECT * FROM user ORDER BY name"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

# Limit 设置查询的数据量，可以通过 "LIMIT" 语句来指定
mycursor.execute("SELECT * FROM user LIMIT 3")
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

# 可以指定起始位置，使用的关键字是 OFFSET
mycursor.execute("SELECT * FROM user LIMIT 3 OFFSET 1")  # 0 为 第一条，1 为第二条，以此类推
myresult = mycursor.fetchall()
for x in myresult:
    print(x)

# 删除记录：Delete from语句
sql = "delete from user where name = 'Daniel'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, '条记录删除')

# 为了防止数据库查询发生 SQL 注入的攻击，我们可以使用 %s 占位符来转义删除语句的条件：
sql = "DELETE FROM user WHERE name = %s"
na = ("stackoverflow", )
mycursor.execute(sql, na)
mydb.commit()
print(mycursor.rowcount, " 条记录删除")

# 更新表数据
sql = "update user set name ='ZH' where name ='Zhihu'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, "条记录被修改")

# 为了防止数据库查询发生 SQL 注入的攻击，我们可以使用 %s 占位符来转义更新语句的条件
sql = "update user set name =%s where name =%s"
val = ('Zhihu', "ZH")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "条记录被修改")

# 删除表
# 删除表使用 "DROP TABLE" 语句， IF EXISTS 关键字是用于判断表是否存在，只有在存在的情况才删除
sql = "DROP TABLE IF EXISTS user"  # 删除数据表 user
mycursor.execute(sql)
